
/*
TSPL命令集（标签打印机）
查看佳博TSPL命令手册

推荐品牌:xprinter
注：200 DPI: 1 mm = 8 dots
   300 DPI: 1 mm = 12 dots
 */
class XBaseTSPLPrintCommandUtils {

  static const String PrintCommand_TSPL_Initialize_SIZE_GAP = "PrintCommand_TSPL_Initialize_SIZE_GAP";
  static const String PrintCommand_TSPL_PRINT = "PrintCommand_TSPL_PRINT";
  static const String PrintCommand_TSPL_DIRECTION = "PrintCommand_TSPL_DIRECTION";
  static const String PrintCommand_TSPL_DENSITY = "PrintCommand_TSPL_DENSITY";
  static const String PrintCommand_TSPL_openCash = "PrintCommand_TSPL_openCash";

  //打印条形码命令ok
  static String tspl_barcode(
      int barcodeX,
      int barcodeY,
      String barcodeText,
      bool isShowCodeText,
      bool isBarcodeMaxHeight,
      int rotation //0,90,180,270
      ){
    /*
                打印条形码
                BARCODE x,y,"code type",height,human_readable,rotation,narrow,wide,"content"
                x 线条左上角 X 坐标，单位 dot
                y 线条左上角 Y 坐标，单位 dot
                height 条形码高度，以点（dot）表示
                human_readable 0 表示人眼不可识，1 表示人眼可识
                rotation 条形码旋转角度，顺时针方向:0，不旋转 90，顺时针方向旋转 90 度 180，顺时针方向旋转 180 度 270，顺时针方向旋转 270 度
                narrow 窄 bar 宽度，以点（dot）表示
                wide 宽 bar 宽度，以点（dot）表示
                code type: 128, 39, 93
                注：200 DPI: 1 mm = 8 dots

                例:
                BARCODE 100,100,"39",96,1,0,2,4,"1000"
                BARCODE 10,10,"128",48,1,0,2,2,"ABCD101EFGH"
                 */

    return 'BARCODE $barcodeX,$barcodeY,"128",${isBarcodeMaxHeight?96:48},${isShowCodeText?1:0},$rotation,2,4,"$barcodeText"\r\n';

  }

  //打印二维码命令ok
  static String tspl_qrcode(
      int qrcodeX,
      int qrcodeY,
      bool isQrcodeMaxWidth,
      String qrcodeText
      ){
    /*
                打印二维码
                QRCODE x,y,ECC level,cell width,mode,rotation,"data string"
                ｘ 二维码水平方向起始点坐标
                ｙ 二维码垂直方向起始点坐标
                ECC level 选择 QRCODE 纠错等级 L 7% M 15%(默认) Q 25% H 30%
                cell width 二维码宽度 1-10
                mode 手动/自动编码 A Auto M Manual
                rotation 旋转角度（顺时针方向） 0 0度 90 90 度 180 180 度 270 270 度
                data string 编码的字符串

                注：200 DPI: 1 mm = 8 dots

                例:
                QRCODE 20,20,L,4,A,0,"www.gainscha.com"
                 */

    return 'QRCODE $qrcodeX,$qrcodeY,M,${isQrcodeMaxWidth?8:4},A,0,"$qrcodeText"\r\n';
  }


  //打印字符串命令ok(原默认不支持换行,这里不处理,在算法方法中统一处理)
  static String tspl_text(
      int textX,
      int textY,
      String text,
      int textSize,
      int rotation //0,90,180,270

      ){
    /*
         命令
         TEXT x,y,"font",rotation,x-multiplication,y-multiplication,"content"
         x-multiplication/y-multiplication 范围1~10
         注意不要漏了",要使用转义符\"
         x 线条左上角 X 坐标，单位 dot
         y 线条左上角 Y 坐标，单位 dot

          注：
          200 DPI: 1 mm = 8 dots
          300 DPI: 1 mm = 12 dots

          注意: 字体选择TSS24.BF2适配中文,通用字体,TSS16/TSS20/TSS32有些打印机不支持,打印不出内容, 而其他0~10字体只适用英文和数字,中文乱码

        */

    String textCommand="";

    if (textSize==1){
      //字体放大1倍
      textCommand='TEXT $textX,$textY,"TSS24.BF2",$rotation,2,2,"$text"\r\n';
    }else if (textSize==2){
      //字体放大2倍
      textCommand='TEXT $textX,$textY,"TSS24.BF2",$rotation,3,3,"$text"\r\n';
    }else{
      //默认字体
      textCommand='TEXT $textX,$textY,"TSS24.BF2",$rotation,1,1,"$text"\r\n';
    }

    return textCommand;

  }

  //画线-方框命令ok
  static String tspl_box(
      int startX,
      int startY,
      int endX,
      int endY,
      int lineThickness //线宽:2

      ){
    /*
         命令
         BOX x_start,y_start,x_end,y_end,line thickness
         BOX 100,100,200,200,5

         x 线条左上角 X 坐标，单位 dot
         y 线条左上角 Y 坐标，单位 dot
          注：
          200 DPI: 1 mm = 8 dots
          300 DPI: 1 mm = 12 dots
        */

    String boxCommand='BOX $startX,$startY,$endX,$endY,$lineThickness\r\n';

    return boxCommand;

  }

  //画线-线条命令ok
  static String tspl_line(
      int startX,
      int startY,
      int width,//线宽
      int height//线高 2

      ){
    /*
         命令
         BAR x,y,width,height
         BAR 100,100,300,200

         x 线条左上角 X 坐标，单位 dot
         y 线条左上角 Y 坐标，单位 dot
         width/height,单位 dot

          注：
          200 DPI: 1 mm = 8 dots
          300 DPI: 1 mm = 12 dots
        */

    String lineCommand='BAR $startX,$startY,$width,$height\r\n';

    return lineCommand;

  }

  //将指定的区域反相打印
  static String tspl_reverse(
      int startX,
      int startY,
      int width,//dot
      int height//dot

      ){
    /*
         命令
         REVERSE x_start,y_start,x_width,y_height

         x 线条左上角 X 坐标，单位 dot
         y 线条左上角 Y 坐标，单位 dot
         width/height,单位 dot

          注：
          200 DPI: 1 mm = 8 dots
          300 DPI: 1 mm = 12 dots
        */

    String reverseCommand='REVERSE $startX,$startY,$width,$height\r\n';

    return reverseCommand;

  }


  //通用命令
  static String getPrintCommand_TSPL(String type, List<int>? values)
  {
    String command="";

    /*
        注意:
        1.每条指令后需要添加 "\r\n"
        2.在单位与数字之间必须添加一个空格
        3.一张标签通常包含三个部分，即系统设定（1部分）、打印内容设定（2部分）和执行打印指令（3部分）
         */

    switch (type){
      case PrintCommand_TSPL_Initialize_SIZE_GAP:
      //1.初始化打印机,设置标签大小,间隔大小,和清除缓存
        if (values!=null && values.length==3){
          int widthMm=values[0];//标签宽度
          int heightMm=values[1];//标签高度
          int gapMm=values[2];//标签间隔空隙
          String size="SIZE $widthMm mm,$heightMm mm\r\n";
          String gap="GAP $gapMm mm,0 mm\r\n";
          String cls="CLS""\r\n";//清除缓存,此项指令必须置于 SIZE 指令之后
          command=size+gap+cls;
        }
        break;
      case PrintCommand_TSPL_PRINT:
      //3.输出打印缓存区内容命令
        if (values!=null && values.isNotEmpty){
          int printCount=values[0];//打印份数
          command="PRINT $printCount\r\n";
        }else{
          command="PRINT 1\r\n";
        }
        break;
      case PrintCommand_TSPL_DIRECTION:
      //打印方向
        command="DIRECTION 1,0\r\n";
        break;
      case PrintCommand_TSPL_DENSITY:
      //打印浓度，深色
        if (values!=null && values.isNotEmpty && values[0]==1){
          //最深色
          command="DENSITY 15\r\n";
        }else{
          //正常
          command="DENSITY 7\r\n";
        }

        break;
      case PrintCommand_TSPL_openCash:
      /*
                打开钱箱
                [命令]
                CASHDRAWER m,t1,t2
                 */
        command="CASHDRAWER 48,48,49\r\n";
        break;
      default:
        break;
    }

    return command;
  }





//打印图片///////////////////


//    ///写入指令
//     byte[] tspl_writeCmd(String cmd, boolean end) {
//        cmd = end ? (cmd + "\r\n") : cmd;
//        byte[] data=null;
//        try {
//            data = cmd.getBytes();
//        } catch (Exception e) {
//            L.sdk(e);
//        }
//
//        return data;
//    }
//
//    ///设置纸张和gap
//     boolean tspl_pageSetup(int widthInMM, int heightInMM, int gapInMM) {
//        if (widthInMM <= 0 || heightInMM <= 0) {
//            return false;
//        }
//        String cmd = String.format("SIZE %d mm, %d mm", widthInMM, heightInMM);
//        tspl_writeCmd(cmd, true);
//        tspl_writeCmd(String.format("GAP %d mm,0", gapInMM), true);
//        return true;
//    }
//
//    ///绘制图片
//    ///1. 算法中对图片以2kb大小进行了切割，防止打印机内存不足，可以自行修改此值
//    ///2. 算法中用经验公式对图片进行了二值化处理，每8个点为1mm
//     boolean tspl_drawGraphic(int start_x, int start_y, Bitmap bmp) {
//        int bmp_size_x = bmp.getWidth();
//        int bmp_size_y = bmp.getHeight();
//        int byteWidth = (bmp_size_x - 1) / 8 + 1; //8个点一个byte,所以要先计算byteWidth
//        int byteHeight = bmp_size_y;
//        if (byteWidth <= 0) return false;
//        if (byteHeight <= 0) return false;
//        int unitHeight = 2048 / byteWidth;//分包规则，算法可无需过多理解，一个包就unitHeight*byteWidth个点
//        int unitCount = (byteHeight - 1) / unitHeight + 1;
//        int startY, endY;//每个包y方向起始的位置
//        byte[] dataByte;
//        int color, A, R, G, B;
//        for (int n = 0; n < unitCount; n++) {
//            startY = n * unitHeight;
//            if ((startY + unitHeight) > bmp_size_y) {
//                endY = bmp_size_y;
//            } else {
//                endY = startY + unitHeight;
//            }
//            int byteLen = (endY - startY) * byteWidth;//每个包数据的字节个数
//            dataByte = new byte[byteLen];
//            for (int y = startY; y < endY; y++) {
//                for (int x = 0; x < bmp_size_x; x++) {
//                    color = bmp.getPixel(x, y);
//                    A = color >> 24 & 0xFF;
//                    R = color >> 16 & 0xFF;
//                    G = color >> 8 & 0xFF;
//                    B = color & 0xFF;
//                    //经验公式二值化，透明视为白色
//                    if (A == 0 || R * 0.3 + G * 0.59 + B * 0.11 > 127) {
//                        dataByte[(y - startY) * byteWidth + x / 8] |= (0x80 >> (x % 8));
//                    }
//                }
//            }
//            int curUnitHeight = n == unitCount - 1 ? (byteHeight - (n * unitHeight)) : unitHeight;
//            String cmdHeader = "BITMAP " + start_x + "," + (start_y + startY) + "," + byteWidth + "," + curUnitHeight + "," + 0 + ",";
//            boolean success = tspl_writeCmd(cmdHeader, false) && mAPI.writeBuffer(dataByte, 0, dataByte.length);
//            if (success) {
//                mAPI.writeBuffer(new byte[]{0x0D, 0x0A}, 0, 2);
//            } else {
//                return false;
//            }
//        }
//        return true;
//    }
//
//    /// 打印
//     boolean tspl_print(int count, boolean isReverse) {
//        if (count < 0) count = 1;
//        if (count > 65535) count = 65535;
//        String cmd = String.format("PRINT %d,1", count);
//        return tspl_direction(isReverse) && tspl_writeCmd(cmd, true);
//    }


}
